//package com.mccken.demo.io.netty.util;
//
//import java.io.File;
//import java.io.IOException;
//import java.net.JarURLConnection;
//import java.net.URL;
//import java.util.ArrayList;
//import java.util.Enumeration;
//import java.util.List;
//import java.util.jar.JarEntry;
//import java.util.jar.JarFile;
//
//import lombok.extern.slf4j.Slf4j;
//
///**
// * 获取接口的所有实现类，理论上也可以用来获取类的所有子类
// * 查询路径有限制，只局限于接口所在模块下，比如pandora-gateway，而非整个pandora (会递归搜索该文件夹下面的所有实现类)
// * 路径不可包含中文，否则会异常。若要支持中文路径，需要对该模块代码中url.getPath()返回值进行urldecode
// *
// * @program: mccken-collect
// * @description:
// * @author: mccken
// * @create: 2022-04-30 19:18
// **/
//@Slf4j
//public class ClassUtil {
//
//	public static List<Class> getAllClassByInterface(Class clazz) {
//		List<Class> list = new ArrayList();
//		// 判断是否是一个接口
//		if (clazz.isInterface()) {
//			try {
//				List<Class> allClass = getAllClass(clazz.getPackage().getName());
//
//				/**
//				 * 循环判断路径下的所有类是否实现了指定的接口，并排除接口类自己
//				 */
//				for (int i = 0; i < allClass.size(); i++) {
//
//					/**
//					 * 判断是不是同一个接口
//					 * 
//					 * isAssignableFrom 判断此 class 对象所表示的类或接口与指定的class参数所表示的类或者接口是否相同，或是否是其父类或父接口
//					 */
//					if (clazz.isAssignableFrom(allClass.get(i))) {
//						if (!clazz.equals(allClass.get(i))) {
//							// 接口自身不加进去
//							list.add(allClass.get(i));
//						}
//					}
//				}
//				
//				
//			} catch (Exception e) {
//				log.error("出现异常{}", e.getMessage());
//				throw new RuntimeException("出现异常" + e.getMessage());
//			}
//		}
//		
//		log.info("class list size: " + list.size());
//		return list;
//	}
//
//	/**
//	 * 从一个指定路径下查找所有的类
//	 *
//	 * @param packageName
//	 * @return
//	 */
//	private static List<Class> getAllClass(String packageName) {
//		log.info("packageName to search: " + packageName);
//		List<String> classNameList = getClassName(packageName);
//		List<Class> list = new ArrayList<>();
//
//		for (String className : classNameList) {
//			try {
//	            list.add(Class.forName(className));
//			} catch (ClassNotFoundException e) {
//				log.error("load class form name faild: " + className + e.getMessage());
//				throw new RuntimeException("load class form name faild: " + className + e.getMessage()); 	
//			}
//		}
//
//		log.info("find list size: " + list.size());
//		return list;
//	}
//
//	/**
//	 * 获取某个包下所有类
//	 *
//	 * @param packageName
//	 * @return
//	 */
//	private static List<String> getClassName(String packageName) {
//
//		List<String> fileNames = null;
//		ClassLoader loader = Thread.currentThread().getContextClassLoader();
//		String packagePath = packageName.replace(".", "/");
//		URL url = loader.getResource(packagePath);
//
//		if (url != null) {
//			String type = url.getProtocol();
//			log.debug("file type: " + type);
//
//			if (type.equals("file")) {
//				String fileSearchPath = url.getPath();
//				log.debug("fileSearchPath: " + fileSearchPath);
//				fileSearchPath = fileSearchPath.substring(0, fileSearchPath.indexOf("/classes"));
//				log.debug("fileSearchPath: " + fileSearchPath);
//				fileNames = getClassNameByFile(fileSearchPath);
//			} else if (type.equals("jar")) {
//				try {
//					JarURLConnection jarURLConnection = (JarURLConnection) url.openConnection();
//					JarFile jarFile = jarURLConnection.getJarFile();
//					fileNames = getClassNameByJar(jarFile, packagePath);
//				} catch (IOException e) {
//					throw new RuntimeException(e);
//				}
//			} else {
//				throw new RuntimeException("file system not support! cannot load MsgProcessor!");
//			}
//		}
//
//		return fileNames;
//	}
//
//	/**
//	 * 从项目文件获取某包下所有类
//	 *
//	 * @param filePath 文件路径
//	 * @return 类的完整名称
//	 */
//	private static List<String> getClassNameByFile(String filePath) {
//
//		List<String> myClassName = new ArrayList<>();
//		File file = new File(filePath);
//		for (File childFile : file.listFiles()) {
//			if (childFile.isDirectory()) {
//				myClassName.addAll(getClassNameByFile(childFile.getName()));
//			} else {
//				String childFilePath = childFile.getPath();
//				if (childFilePath.endsWith(".class")) {
//					childFilePath = childFilePath.substring(childFilePath.indexOf("classes") + 8, childFilePath.lastIndexOf("."));
//					childFilePath = childFilePath.replace("/", ".");
//					myClassName.add(childFilePath);
//				}
//			}
//		}
//
//		return myClassName;
//	}
//
//	/**
//	 * 从jar获取某包下所有类
//	 *
//	 * @param jarFile
//	 * @param packagePath
//	 * @return
//	 */
//	private static List<String> getClassNameByJar(JarFile jarFile, String packagePath) {
//		List<String> myClassName = new ArrayList<>();
//
//		try {
//			Enumeration<JarEntry> entrys = jarFile.entries();
//			while (entrys.hasMoreElements()) {
//				JarEntry jarEntry = entrys.nextElement();
//				String jarEntryName = jarEntry.getName();
//				if (jarEntryName.endsWith(".class")) {
//					jarEntryName = jarEntryName.replace("/", ".").substring(0, jarEntryName.lastIndexOf("."));
//					myClassName.add(jarEntryName);
//				}
//			}
//		} catch (Exception e) {
//			throw new RuntimeException(e);
//		}
//
//		return myClassName;
//	}
//}
